/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.espe.ccsoft.mantenimiento.bean;

import ec.edu.espe.ccsoft.mantenimiento.modelos.Rol;
import ec.edu.espe.ccsoft.mantenimiento.modelos.Usuario;
import ec.edu.espe.ccsoft.mantenimiento.servicios.RolServicio;
import ec.edu.espe.ccsoft.mantenimiento.servicios.UsuarioServicio;
import ec.edu.espe.ccsoft.mantenimiento.utils.ManejoAcciones;
import ec.edu.espe.ccsoft.mantenimiento.utils.Mensajes;
import ec.edu.espe.ccsoft.mantenimiento.validaciones.ValidacionCedula;
import java.io.Serializable;
import java.util.Calendar;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;

/**
 *
 * @author misahaelfernandez
 */
@ManagedBean
@SessionScoped
public class UsuarioBean extends ManejoAcciones implements Serializable {

    @EJB
    private UsuarioServicio usuarioServicio;
    @EJB
    private RolServicio rolServicio;
    private List<Usuario> usuarios;
    private List<Rol> roles;
    private Usuario usuario;
    private Mensajes mensaje;
    private ValidacionCedula validarCedula;
    private String antiguaContrasena;
    private String nuevaContrasena;
    private Boolean nuevoUsuario;

    @PostConstruct
    public void init() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        int codigoUsuario = (Integer) session.getAttribute("codigoUsuario");

        nuevoUsuario = usuarioServicio.obtenerUsuarioPorCodigo(codigoUsuario).getNuevo();
        usuarios = usuarioServicio.obtenerTodosActivos();
        roles = rolServicio.obtenerTodosActivos();
        mensaje = new Mensajes();
        validarCedula = new ValidacionCedula();
    }

    public void cargarNuevo() {
        usuario = new Usuario();
        super.nuevoRegistro();
        tituloDialogo = tituloDialogo + " Usuario";
    }

    public void cargarModificar() {
        super.modificarRegistro();
        tituloDialogo = tituloDialogo + " Usuario";
    }

    public void cargarDetalles() {
        super.detallesRegistro();
        tituloDialogo = tituloDialogo + " Usuario";
    }

    public void guardar() {
        try {
            Usuario usuarioAux = usuarioServicio.findUsuarioByEmail(usuario.getEmail());
            if (validarCedula.valida(usuario.getCedula()) && usuarioAux == null) {
                usuario.setNuevo(true);
                usuario.setFechaCreacion(Calendar.getInstance().getTime());
                usuario.setUltimoIngreso(Calendar.getInstance().getTime());
                usuario.setEstado(true);
                this.usuarioServicio.crear(usuario);
                usuarios.add(usuario);
                mensaje.addMessageSuccefull("Información", "El usuario ha sido creado con éxito");
                RequestContext.getCurrentInstance().update("@form");
                RequestContext.getCurrentInstance().execute("PF('dlDialogVar').hide();");
            } else {
                if (validarCedula.valida(usuario.getCedula()) == false) {
                    mensaje.addMessageSuccefull("Error", "La cedula ingresada no es correcta");
                }
                if (usuarioAux != null) {
                    mensaje.addMessageSuccefull("Error", "El correo ya se encuentra registrado");
                }
            }
        } catch (Exception e) {
            mensaje.addMessageError("Error", "Error al crear el usuario " + e.getMessage());
        }
    }

    public void modificar() {
        try {
            this.usuarioServicio.actualizar(usuario);
            if (!usuario.getEstado()) {
                usuarios.remove(usuario);
                mensaje.addMessageSuccefull("Información", "El usuario ha sido eliminado con éxito");
            } else {
                mensaje.addMessageSuccefull("Información", "El usuario ha sido modificado con éxito");
            }
            RequestContext.getCurrentInstance().update("@form");
            RequestContext.getCurrentInstance().execute("PF('dlDialogVar').hide();");
        } catch (Exception e) {
            mensaje.addMessageError("Error", "Error al modificar el usuario " + e.getMessage());
        }
    }

    public String cambiarContrasena() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        Integer codigoUsuario = (Integer) session.getAttribute("codigoUsuario");

        Usuario usuarioTmp = usuarioServicio.obtenerUsuarioPorCodigo(codigoUsuario);
        usuarioTmp.setContrasena(nuevaContrasena);

        try {
            this.usuarioServicio.actualizar(usuarioTmp);
            mensaje.addMessageSuccefull("Información", "Se ha modificado la contraseña con éxito");
            return "Home.xhtml";
        } catch (Exception e) {
            mensaje.addMessageError("Error", "Error al modificar el usuario " + e.getMessage());
        }
        
        return null;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Mensajes getMensaje() {
        return mensaje;
    }

    public void setMensaje(Mensajes mensaje) {
        this.mensaje = mensaje;
    }

    public List<Rol> getRoles() {
        return roles;
    }

    public String getAntiguaContrasena() {
        return antiguaContrasena;
    }

    public void setAntiguaContrasena(String antiguaContrasena) {
        this.antiguaContrasena = antiguaContrasena;
    }

    public String getNuevaContrasena() {
        return nuevaContrasena;
    }

    public void setNuevaContrasena(String nuevaContrasena) {
        this.nuevaContrasena = nuevaContrasena;
    }

    public Boolean getNuevoUsuario() {
        return nuevoUsuario;
    }

    public void setNuevoUsuario(Boolean nuevoUsuario) {
        this.nuevoUsuario = nuevoUsuario;
    }

    public Rol obtenerRol(Object codigo) {

        try {
            Integer codigoRol = Integer.parseInt(codigo.toString());
            return rolServicio.obtenerPorCodigo(codigoRol);
        } catch (Exception e) {
            return null;
        }
    }
}
